package com.lcw.library.imagepicker.manager;

import android.content.Context;
// 移除Log导入，生产环境不需要
import android.widget.Toast;

import com.lcw.library.imagepicker.R;
import com.lcw.library.imagepicker.utils.MediaFileUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * 媒体选择集合管理类
 * 
 * 使用单例模式管理用户选择的图片和视频：
 * - 添加/移除选择的媒体文件
 * - 检查选择状态
 * - 管理最大选择数量
 * - 支持图片和视频的分别限制
 * - 单类型选择模式支持
 * - 批量添加历史选择记录
 * 
 */
public class SelectionManager {

    private static volatile SelectionManager mSelectionManager;

    private ArrayList<String> mSelectImagePaths = new ArrayList<>();

    private int mMaxCount = 1;
    private int mMaxVideoCount = 1;

    private SelectionManager() {
    }

    public static SelectionManager getInstance() {
        if (mSelectionManager == null) {
            synchronized (SelectionManager.class) {
                if (mSelectionManager == null) {
                    mSelectionManager = new SelectionManager();
                }
            }
        }
        return mSelectionManager;
    }

    /**
     * 设置最大选择数
     *
     * @param maxCount
     */
    public void setMaxCount(int maxCount) {
        this.mMaxCount = maxCount;
    }

    /**
     * 获取当前设置最大选择数
     *
     * @return
     */
    public int getMaxCount() {
        return this.mMaxCount;
    }

    /**
     * 设置最大选择视频数量
     *
     * @param maxVideoCount
     */
    public void setMaxVideoCount(int maxVideoCount) {
        this.mMaxVideoCount = maxVideoCount;
    }

    /**
     * 获取最大选择视频数量
     *
     * @return
     */
    public int getMaxVideoCount() {
        return this.mMaxVideoCount;
    }

    /**
     * 获取当前所选图片集合path
     *
     * @return
     */
    public ArrayList<String> getSelectPaths() {
        return mSelectImagePaths;
    }

    /**
     * 添加/移除图片或视频到选择集合
     * 如果已存在则移除，如果不存在则添加（前提是未超过最大数量）
     *
     * @param context 上下文，用于显示提示信息
     * @param imagePath 图片或视频的路径
     * @return true表示操作成功，false表示操作失败（通常是超过最大数量）
     */
    public boolean addImageToSelectList(Context context, String imagePath) {
        // 调试日志已移除，生产环境不需要输出
        if (mSelectImagePaths.contains(imagePath)) {
            return mSelectImagePaths.remove(imagePath);
        } else {
            if (MediaFileUtil.isVideoFileType(imagePath)) {
                if (mSelectImagePaths.size() < mMaxVideoCount) {
                    return mSelectImagePaths.add(imagePath);
                } else {
                    Toast.makeText(context, String.format(context.getString(R.string.select_video_max), mMaxVideoCount), Toast.LENGTH_SHORT).show();
                    return false;
                }
            } else {
                if (mSelectImagePaths.size() < mMaxCount) {
                    return mSelectImagePaths.add(imagePath);
                } else {
                    Toast.makeText(context, String.format(context.getString(R.string.select_image_max), mMaxCount), Toast.LENGTH_SHORT).show();
                    return false;
                }
            }
        }
    }

    /**
     * 批量添加图片到选择集合
     * 用于恢复历史选择记录
     *
     * @param imagePaths 图片路径列表
     */
    public void addImagePathsToSelectList(List<String> imagePaths) {
        if (imagePaths != null) {
            for (int i = 0; i < imagePaths.size(); i++) {
                String imagePath = imagePaths.get(i);
                if (!mSelectImagePaths.contains(imagePath) && mSelectImagePaths.size() < mMaxCount) {
                    mSelectImagePaths.add(imagePath);
                }
            }
        }
    }


    /**
     * 判断当前图片是否被选择
     *
     * @param imagePath 图片路径
     * @return true表示已选择，false表示未选择
     */
    public boolean isImageSelect(String imagePath) {
        return mSelectImagePaths.contains(imagePath);
    }

    /**
     * 是否还可以继续选择图片
     *
     * @return true表示可以继续选择，false表示已达到最大数量
     */
    public boolean isCanChoose() {
        return getSelectPaths().size() < mMaxCount;
    }

    /**
     * 是否可以添加到选择集合（在singleType模式下，图片视频不能一起选）
     *
     * @param currentPath
     * @param filePath
     * @return
     */
    public static boolean isCanAddSelectionPaths(String currentPath, String filePath) {
        if ((MediaFileUtil.isVideoFileType(currentPath) && !MediaFileUtil.isVideoFileType(filePath)) || (!MediaFileUtil.isVideoFileType(currentPath) && MediaFileUtil.isVideoFileType(filePath))) {
            return false;
        }
        return true;
    }

    /**
     * 清除已选图片
     */
    public void removeAll() {
        mSelectImagePaths.clear();
    }

}
